﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;

namespace NTTDATA.BEENChina.ResultCertification.Util
{
    public partial class JaStringUtil
    {

        private static char[] HANKAKU_KATAKANA = {
                                                     '｡', '｢', '｣', '､', '･',
                                                     'ｦ', 'ｧ', 'ｨ', 'ｩ', 'ｪ', 'ｫ', 'ｬ', 'ｭ', 'ｮ', 'ｯ', 'ｰ', 'ｱ', 'ｲ',
                                                     'ｳ', 'ｴ', 'ｵ', 'ｶ', 'ｷ', 'ｸ', 'ｹ', 'ｺ', 'ｻ', 'ｼ', 'ｽ', 'ｾ', 'ｿ',
                                                     'ﾀ', 'ﾁ', 'ﾂ', 'ﾃ', 'ﾄ', 'ﾅ', 'ﾆ', 'ﾇ', 'ﾈ', 'ﾉ', 'ﾊ', 'ﾋ', 'ﾌ',
                                                     'ﾍ', 'ﾎ', 'ﾏ', 'ﾐ', 'ﾑ', 'ﾒ', 'ﾓ', 'ﾔ', 'ﾕ', 'ﾖ', 'ﾗ', 'ﾘ', 'ﾙ',
                                                     'ﾚ', 'ﾛ', 'ﾜ', 'ﾝ', 'ﾞ', 'ﾟ'
                                                 };

        private static char[] ZENKAKU_KATAKANA = {
                                                     '。', '「', '」', '、', '・',
                                                     'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ',
                                                     'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ',
                                                     'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ',
                                                     'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル',
                                                     'レ', 'ロ', 'ワ', 'ン', '゛', '゜'
                                                 };

        private static char HANKAKU_KATAKANA_FIRST_CHAR = HANKAKU_KATAKANA[0];

        private static char HANKAKU_KATAKANA_LAST_CHAR = HANKAKU_KATAKANA[HANKAKU_KATAKANA.Length - 1];

        /**
         * 半角カタカナから全角カタカナへ変換します。
         * @param c 変換前の文字
         * @return 変換後の文字
         */

        private static char HankakuKatakanaToZenkakuKatakana(char c)
        {
            if (c >= HANKAKU_KATAKANA_FIRST_CHAR && c <= HANKAKU_KATAKANA_LAST_CHAR)
            {
                return ZENKAKU_KATAKANA[c - HANKAKU_KATAKANA_FIRST_CHAR];
            }
            else
            {
                return c;
            }
        }

        /**
         * 2文字目が濁点・半濁点で、1文字目に加えることができる場合は、合成した文字を返します。
         * 合成ができないときは、c1を返します。
         * @param c1 変換前の1文字目
         * @param c2 変換前の2文字目
         * @return 変換後の文字
         */

        private static char MergeChar(char c1, char c2)
        {
            if (c2 == 'ﾞ')
            {
                if ("ｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾊﾋﾌﾍﾎ".IndexOf(c1) > -1)
                {
                    switch (c1)
                    {
                        case 'ｶ':
                            return 'ガ';
                        case 'ｷ':
                            return 'ギ';
                        case 'ｸ':
                            return 'グ';
                        case 'ｹ':
                            return 'ゲ';
                        case 'ｺ':
                            return 'ゴ';
                        case 'ｻ':
                            return 'ザ';
                        case 'ｼ':
                            return 'ジ';
                        case 'ｽ':
                            return 'ズ';
                        case 'ｾ':
                            return 'ゼ';
                        case 'ｿ':
                            return 'ゾ';
                        case 'ﾀ':
                            return 'ダ';
                        case 'ﾁ':
                            return 'ヂ';
                        case 'ﾂ':
                            return 'ヅ';
                        case 'ﾃ':
                            return 'デ';
                        case 'ﾄ':
                            return 'ド';
                        case 'ﾊ':
                            return 'バ';
                        case 'ﾋ':
                            return 'ビ';
                        case 'ﾌ':
                            return 'ブ';
                        case 'ﾍ':
                            return 'ベ';
                        case 'ﾎ':
                            return 'ボ';
                    }
                }
            }
            else if (c2 == 'ﾟ')
            {
                if ("ﾊﾋﾌﾍﾎ".IndexOf(c1) > -1)
                {
                    switch (c1)
                    {
                        case 'ﾊ':
                            return 'パ';
                        case 'ﾋ':
                            return 'ピ';
                        case 'ﾌ':
                            return 'プ';
                        case 'ﾍ':
                            return 'ペ';
                        case 'ﾎ':
                            return 'ポ';
                    }
                }
            }
            return c1;
        }

       
        private static char KatakanaToZenHirakana(char input)
        {
            var jaTable = new Dictionary<char, char>()
                                               {
                                                   {'ア','あ'},{'イ','い'},{'ウ','う'},{'エ','え'},{'オ','お'},{'カ','か'},
                                                   {'キ','き'},{'ク','く'},{'ケ','け'},{'コ','こ'},{'サ','さ'},{'シ','し'},
                                                   {'ス','す'},{'セ','せ'},{'ソ','そ'},{'タ','た'},{'チ','ち'},{'ツ','つ'},
                                                   {'テ','て'},{'ト','と'},{'ナ','な'},{'ニ','に'},{'ヌ','ぬ'},{'ネ','ね'},
                                                   {'ノ','の'},{'ハ','は'},{'ヒ','ひ'},{'フ','ふ'},{'ヘ','へ'},{'ホ','ほ'},
                                                   {'マ','ま'},{'ミ','み'},{'ム','む'},{'メ','め'},{'モ','も'},{'ヤ','や'},
                                                   {'ユ','ゆ'},{'ヨ','よ'},{'ラ','ら'},{'リ','り'},{'ル','る'},{'レ','れ'},
                                                   {'ロ','ろ'},{'ワ','わ'},{'ヲ','を'},{'ン','ん'},{'ッ','っ'},{'ガ','が'},
                                                   {'ギ','ぎ'},{'グ','ぐ'},{'ゲ','げ'},{'ゴ','ご'},{'ザ','ざ'},{'ジ','じ'},
                                                   {'ズ','ず'},{'ゼ','ぜ'},{'ゾ','ぞ'},{'ダ','だ'},{'ヂ','ぢ'},{'ヅ','づ'},
                                                   {'デ','で'},{'ド','ど'},{'バ','ば'},{'ビ','び'},{'ブ','ぶ'},{'ベ','べ'},
                                                   {'ボ','ぼ'},{'パ','ぱ'},{'ピ','ぴ'},{'プ','ぷ'},{'ペ','ぺ'},{'ポ','ぽ'},
                                                   {'ャ','ゃ'},{'ュ','ゅ'},{'ョ','ょ'},
                                                   {'ヱ','え'} 
                                               };

            char output;

            bool find = jaTable.TryGetValue(input, out output);
            if (!find)
            {
                output = input;
            }

            return output;
        }

        /**
         * 文字列中の半角カタカナを全角カタカナに変換します。
         * @param s 変換前文字列
         * @return 変換後文字列
         */
        public static string HankakuKatakanaToZenkakuKatakana(string s)
        {
            if (s.Length == 0)
            {
                return s;
            }
            else
            {
               // s = B2Q(s);
               // s = CharacterChange.ToSbc(s);

                if (s.Length == 1)
                {
                    return HankakuKatakanaToZenkakuKatakana(s[0]).ToString(CultureInfo.InvariantCulture);
                    //s.charAt(0)) + "";
                }
                else
                {

                    StringBuilder sb = new StringBuilder(s);
                    int i = 0;
                    for (i = 0; i < sb.Length - 1; i++)
                    {
                        char originalChar1 = sb[i];
                        char originalChar2 = sb[i + 1];
                        char margedChar = MergeChar(originalChar1, originalChar2);

                        if (margedChar != originalChar1)
                        {
                            //sb.setCharAt(i, margedChar);
                            //sb.deleteCharAt(i + 1);

                            sb[i] = margedChar;
                            sb.Remove(i + 1, 1);

                        }
                        else
                        {
                            char convertedChar = HankakuKatakanaToZenkakuKatakana(originalChar1);
                            if (convertedChar != originalChar1)
                            {
                                //sb.setCharAt(i, convertedChar);
                                sb[i] = convertedChar;
                            }
                        }
                    }
                    if (i < sb.Length)
                    {
                        char originalChar1 = sb[i]; //.charAt(i);
                        char convertedChar = HankakuKatakanaToZenkakuKatakana(originalChar1);
                        if (convertedChar != originalChar1)
                        {
                            //sb.setCharAt(i, convertedChar);
                            sb[i] = convertedChar;

                        }
                    }
                    return sb.ToString();
                }
            }
        }

        public static string ZenKatakanaToZenHirakana(string s)
        {


            char[] c = s.ToCharArray();
            for (int i = 0; i < c.Length; i++)
            {
                //c >= 0x30A0 && c <= 0x30FF) 片假名
                //uFF61 - uFF9F 半角日语字符
                //if ((c[i] >= 0x30A0 && c[i] <= 0x30FF) ||
                //    (c[i] >= 0xFF61 && c[i] <= 0xFF9F))
                //{ }

                c[i] = KatakanaToZenHirakana(c[i]);
            }
            return new String(c);
        }

        /// <summary>
        /// 日文片假名 转换成 平假名
        /// 转换包括 全角片假名 半角片假名
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static string ChangeJaInputToHirakana(string s)
        {
            string zenKatakana = HankakuKatakanaToZenkakuKatakana(s);
            string zenHirakana = ZenKatakanaToZenHirakana(zenKatakana);

            return zenHirakana;

           // return KatakanaToHiragana(s);


        }



    }
}
